home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 30
/
Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso
/
Aminet
/
text
/
misc
/
MSWordView_src.lha
/
mswordview
/
stylesheet.c
< prev
next >
Wrap
C/C++ Source or Header
|
1998-12-14
|
7KB
|
262 lines
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "config.h"
#include "mswordview.h"
int nostyles;
extern FILE *erroroutput;
style *decode_stylesheet(FILE *tablefd,U32 stsh,U32 stshlen)
{
U16 sprm=0;
U16 j;
int i,upxbytes,len,m;
U16 thingy;
U16 cb;
style *stylelist;
U16 pos;
int baseistd;
int tempistd;
error(erroroutput,"the new stsh is (%x), len (%x)\n",stsh,stshlen);
fseek(tablefd,stsh,SEEK_SET);
error(erroroutput,"not really stsh size is %ld\n",read_16ubit(tablefd));
nostyles = read_16ubit(tablefd);
error(erroroutput,"count of styles is %d\n",nostyles);
error(erroroutput,"cbSTDBaseInFile is %ld\n",read_16ubit(tablefd));
for (i=0;i<7;i++)
read_16ubit(tablefd);
stylelist = (style *) malloc(sizeof(style) * nostyles);
if (stylelist == NULL)
{
fprintf(erroroutput,"arse no mem for styles !\n");
exit(-1);
}
for (m=0;m<nostyles;m++)
{
cb = read_16ubit(tablefd);
error(erroroutput,"size of std %ld\n",cb);
init_pap(&stylelist[m].thepap);
init_chp(&stylelist[m].thechp);
error(erroroutput,"m val is %d\n",m);
if (cb != 0)
{
pos=0;
read_16ubit(tablefd);
pos+=2;
j = read_16ubit(tablefd);
pos+=2;
baseistd = j>>4;
error(erroroutput,"based upon istd is %d %d",j,baseistd);
if (baseistd < 0x0ffe)
{
if (baseistd < m)
fill_pap(stylelist,m,baseistd);
else
error(erroroutput,"how can i be based on a style that i havent seen yet?\n");
}
else
error(erroroutput,"WARNING strange and unsupported istd base %x\n",baseistd);
j = read_16ubit(tablefd);
pos+=2;
error(erroroutput,"# of upx is %d %d\n",j,j>>12);
upxbytes = j;
for (i=0;i<2;i++)
{
read_16ubit(tablefd);
pos+=2;
}
len = read_16ubit(tablefd);
pos+=2;
error(erroroutput,"name len is %d,\n",len);
for(i=0;i<len+1;i++)
{
thingy = read_16ubit(tablefd);
pos+=2;
error(erroroutput,"thingy is %ld (%X) (-%x-) (-%c-)\n",thingy,thingy,thingy,thingy);
}
error(erroroutput,"pos is %x and %d",ftell(tablefd),pos);
if ((pos+1)/2 != pos/2)
{
/*eat odd bytes*/
error(erroroutput,"odd offset\n");
fseek(tablefd,1,SEEK_CUR);
pos++;
}
if (pos == cb)
{
error(erroroutput,"continuing\n");
continue;
}
else if (pos > cb)
{
error(erroroutput,"rewinding & continuing\n");
fseek(tablefd,cb-pos,SEEK_CUR);
continue;
}
if ((pos+1)/2 != pos/2)
{
/*eat odd bytes*/
error(erroroutput,"odd offset\n");
fseek(tablefd,1,SEEK_CUR);
pos++;
}
if (pos == cb)
{
error(erroroutput,"continuing\n");
continue;
}
else if (pos > cb)
{
error(erroroutput,"rewinding & continuing\n");
fseek(tablefd,cb-pos,SEEK_CUR);
continue;
}
/*read some kind of len variable, hairy territory again*/
upxbytes = read_16ubit(tablefd);
pos+=2;
error(erroroutput,"1 eat %d bytes",upxbytes);
j=0;
if (upxbytes > 1)
{
tempistd = read_16ubit(tablefd);
pos+=2;
j+=2;
if (tempistd != m)
{
error(erroroutput,"istds mismatch is %x %x\n",m,tempistd);
/*treat it as a sprm instead*/
sprm = tempistd;
}
else
{
if (j < upxbytes)
{
sprm = read_16ubit(tablefd);
j+=2;
pos+=2;
}
}
}
while (j<upxbytes)
{
error(erroroutput," j was %d\n",j);
pos-=j;
decode_sprm(tablefd,sprm,&(stylelist[m].thepap),&(stylelist[m].thechp),NULL,&j,NULL,stylelist,stylelist[m].thepap.istd);
error(erroroutput," j is %d\n",j);
pos+=j;
if (j>=upxbytes)
break;
sprm = read_16ubit(tablefd);
j+=2;
pos+=2;
}
if ((pos+1)/2 != pos/2)
{
/*eat odd bytes*/
error(erroroutput,"odd offset\n");
fseek(tablefd,1,SEEK_CUR);
error(erroroutput,"were at %x\n",ftell(tablefd));
pos++;
}
if (pos == cb)
{
error(erroroutput,"continuing\n");
continue;
}
else if (pos > cb)
{
error(erroroutput,"rewinding & continuing\n");
fseek(tablefd,cb-pos,SEEK_CUR);
continue;
}
/*then this is the len of bytes of the next stuff*/
upxbytes = read_16ubit(tablefd);
pos+=2;
error(erroroutput,"2 eat %d bytes",upxbytes);
/*k this is the good stuff*/
j=0;
while (j < upxbytes)
{
sprm = read_16ubit(tablefd);
j+=2;
pos+=2;
error(erroroutput," j was %d\n",j);
pos-=j;
decode_sprm(tablefd,sprm,&(stylelist[m].thepap),&(stylelist[m].thechp),NULL,&j,NULL,stylelist,stylelist[m].thepap.istd);
error(erroroutput," j is %d\n",j);
pos+=j;
}
if ((pos+1)/2 != pos/2)
{
/*eat odd bytes*/
error(erroroutput,"odd offset\n");
fseek(tablefd,1,SEEK_CUR);
pos++;
}
error(erroroutput,"m val %d, ilfo is %d\n",m,stylelist[m].thepap.ilfo);
}
}
return(stylelist);
}
void fill_pap(style *stylelist,int m,int b)
{
stylelist[m].thepap.fInTable = stylelist[b].thepap.fInTable;
stylelist[m].thepap.fTtp= stylelist[b].thepap.fTtp;
stylelist[m].thepap.ilvl = stylelist[b].thepap.ilvl;
stylelist[m].thepap.ilfo = stylelist[b].thepap.ilfo;
stylelist[m].thepap.list_data=stylelist[b].thepap.list_data;
stylelist[m].thepap.leftmargin=stylelist[b].thepap.leftmargin;
stylelist[m].thepap.firstline=stylelist[b].thepap.firstline;
stylelist[m].thechp.fBold=stylelist[b].thechp.fBold;
stylelist[m].thechp.fItalic=stylelist[b].thechp.fItalic;
stylelist[m].thechp.fCaps =stylelist[b].thechp.fCaps;
stylelist[m].thechp.animation=stylelist[b].thechp.animation;
stylelist[m].thechp.ascii_font=stylelist[b].thechp.ascii_font;
stylelist[m].thechp.eastfont=stylelist[b].thechp.eastfont;
stylelist[m].thechp.noneastfont=stylelist[b].thechp.noneastfont;
stylelist[m].thechp.fontsize=stylelist[b].thechp.fontsize;
stylelist[m].thechp.supersubscript= stylelist[b].thechp.supersubscript;
stylelist[m].thechp.fontcode=stylelist[b].thechp.fontcode;
stylelist[m].thechp.fontspec=stylelist[b].thechp.fontspec;
strcpy(stylelist[m].thechp.color,stylelist[b].thechp.color);
stylelist[m].thechp.underline=stylelist[b].thechp.underline;
stylelist[m].thechp.fSpec=stylelist[b].thechp.fSpec;
stylelist[m].thechp.fObj=stylelist[b].thechp.fObj;
stylelist[m].thechp.idctHint=stylelist[b].thechp.idctHint;
stylelist[m].thechp.fcPic=stylelist[b].thechp.fcPic;
stylelist[m].thechp.fData=stylelist[b].thechp.fData;
stylelist[m].thechp.fStrike=stylelist[b].thechp.fStrike;
stylelist[m].thechp.fDStrike=stylelist[b].thechp.fDStrike;
}